package org.framework.common.ext.util;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;

public class DateUtil {

	/**
	 * <p>描述: 日期范围类型</p>
	 * <p>Company: Professional</p>
	 * @author chanlong(陈龙)
	 * @date 2016年2月13日 上午11:58:55
	 * @version 1.0.2016
	 */
	public enum DateRange{
		YEAR, MONTH, WEEK, DATE
	}
	
	/**
	 * <p>描述: 日期格式</p>
	 * <p>Company: Professional</p>
	 * @author chanlong(陈龙)
	 * @date 2016年2月13日 上午11:59:36
	 * @version 1.0.2016
	 */
	public enum DatePattern{
		TIME("HH:mm"),
		DATE("yyyy-MM-dd"), 
		DATETIME("yyyy-MM-dd HH:mm:ss");
		
		private String value;
		
		private DatePattern(String value){
			this.value = value;
		}

		public String value() {
			return value;
		}
	}
	
	public static String current(){
		return DateFormatUtils.format(new Date(), DatePattern.DATE.value);
	}
	
	public static String currentime(){
		return DateFormatUtils.format(new Date(), DatePattern.DATETIME.value);
	}
	
	/**
	 * 返回指定范围类型的时间组 <br>
	 * ps: 默认为返回当前月的时间组 <br> 
	 * eg: range(RangeType.MONTH, null).
	 * 
	 * @param type 范围类型(year|month|week)
	 * @param basis 依据时间(null of new Date())
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2016年2月13日 上午11:51:34
	 */
	public static Date[] range(final DateRange type, final Date basis){
		switch (type) {
			case MONTH: return rangeOfMonth(basis);
			case DATE: {
				String date = DateFormatUtils.format(basis, DatePattern.DATETIME.value);
				System.out.println(date);
			}
			default: return rangeOfMonth(basis);
		}
	}
	
	/**
	 * 返回指定范围类型的时间组 <br>
	 * ps: 默认为返回当前月的时间组 <br> 
	 * eg: range(RangeType.MONTH, null).
	 * 
	 * @param type 范围类型(year|month|week)
	 * @param basis 依据时间(null of new Date())
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2016年2月13日 上午11:51:34
	 */
	public static Date[] range(final DateRange type, final Object basis){
		try {
			String dmp = String.valueOf(basis);
			Date date = DateUtils.parseDate(dmp, DatePattern.DATE.value, DatePattern.DATETIME.value);
			switch (type) {
				case MONTH:
					return rangeOfMonth(date);
				case DATE: {
					return new Date[]{
						DateUtils.parseDate(dmp+" 00:00:00", DatePattern.DATETIME.value),
						DateUtils.parseDate(dmp+" 23:59:59", DatePattern.DATETIME.value)
					};
				}
				default:
					return rangeOfMonth(date);
				}
		} catch (ParseException e) {
			return null;
		}
	}
	
	/**
	 * 根据字符串值返回时间范围.
	 * @param amount
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2016年8月5日 下午3:00:30
	 */
	public static Date[] range(final Object value, DatePattern pattern){
		String[] dates = String.valueOf(value).split(",");
		try {
			return new Date[]{DateUtils.parseDate(dates[0], pattern.value), DateUtils.parseDate(dates[1], pattern.value)};
		} catch (ParseException e) {
			return range(DateRange.MONTH, new Date());
		}
	}
	
	/**
	 * 根据天数返回时间范围.
	 * @param amount
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2016年8月5日 下午3:00:30
	 */
	public static Date[] range(final int amount){
		Date _over = new Date();
		Date _from = DateUtils.addDays(_over, -amount);
		return new Date[]{_from, _over};
	}
	
	// 返回依据日期所在月的第一天和最后一天
	private static Date[] rangeOfMonth(final Date basis){
		Date now = basis == null ? new Date() : basis;
		Calendar calendar = DateUtils.toCalendar(now);
		
		Date fromDate = DateUtils.setDays(now, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
		Date overDate = DateUtils.setDays(now, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
		
		return new Date[]{fromDate, overDate};
	}
	
	public static void main(String[] args) throws ParseException {
		System.out.println(DateFormatUtils.format(range(DateRange.MONTH, DateUtils.parseDate("2016-07-12", DatePattern.DATE.value))[1], DatePattern.DATE.value));
		System.out.println(range(1)[1]);
		System.out.println(current());
	}
}
